package com.zyz.sunliky.controller;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@RestController
public class ExcelSplitController {

    @PostMapping("/split-excel")
    public String splitExcel(@RequestBody byte[] excelData) {
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(excelData);
            // 从请求体中接收Excel文件的字节数组，并加载为工作簿对象
            Workbook workbook = new XSSFWorkbook(bis);

            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);

            // 定义拆分后的每个文件的行数
            int rowsPerSplit = 100;

            // 计算原始工作表的总行数
            int totalRows = sheet.getPhysicalNumberOfRows();

            // 计算需要拆分成多少个文件
            int fileCount = (int) Math.ceil((double) totalRows / rowsPerSplit);

            // 拆分Excel文件并输出
            for (int i = 0; i < fileCount; i++) {
                // 创建新的工作簿对象
                Workbook newWorkbook = new XSSFWorkbook();
                // 创建新的工作表
                Sheet newSheet = newWorkbook.createSheet("Sheet1");

                // 写入数据到新的工作表
                for (int j = i * rowsPerSplit; j < Math.min((i + 1) * rowsPerSplit, totalRows); j++) {
                    Row originalRow = sheet.getRow(j);
                    Row newRow = newSheet.createRow(j - i * rowsPerSplit);
                    for (int k = 0; k < originalRow.getPhysicalNumberOfCells(); k++) {
                        Cell originalCell = originalRow.getCell(k);
                        Cell newCell = newRow.createCell(k);
                        if (originalCell != null) {
                            switch (originalCell.getCellType()) {
                                case STRING:
                                    newCell.setCellValue(originalCell.getStringCellValue());
                                    break;
                                case NUMERIC:
                                    newCell.setCellValue(originalCell.getNumericCellValue());
                                    break;
                                // 其他类型的Cell可以根据需要进行处理
                            }
                        }
                    }
                }

                String filePath = "C:\\Users\\admin\\Documents\\split_file_" + i + ".xlsx";

                // 获取文件夹路径
                File file = new File(filePath);
                //File parentDir = file.getParentFile();

                // 如果父文件夹不存在，则递归创建
//                if (!parentDir.exists()) {
//                    parentDir.mkdirs(); // 递归创建父文件夹
//                }
                // 将新工作簿写入到文件  D:\java\tset
                //try (FileOutputStream fileOut = new FileOutputStream("split_file_" + i + ".xlsx"))
                try (
                        //FileOutputStream fileOut = new FileOutputStream("D:\\aa\\tset\\split_file_" + i + ".xlsx"))
                        FileOutputStream fileOut = new FileOutputStream(file))
                {
                    newWorkbook.write(fileOut);
                }
                newWorkbook.close();
            }

            workbook.close();

            return "Excel file split successfully";
        } catch (IOException e) {
            e.printStackTrace();
            return "Failed to split the Excel file";
        }
    }
}
